package com.lizhi.yun.core.rolemenu.handler;

import com.lizhi.common.yun.entity.ListResponseResult;
import com.lizhi.common.yun.enums.ButtonIdsEnum;
import com.lizhi.yun.db.dao.UppMenuDao;
import com.lizhi.yun.db.dao.UppRoleMenuDao;
import com.lizhi.yun.db.pojo.UppMenuPOJO;
import com.lizhi.yun.db.pojo.UppRoleMenuPOJO;
import com.lizhi.mybatis.interceptor.PageBounds;
import com.lizhi.mybatis.page.Pager;
import com.lizhi.utils.date.DateUtils;
import com.lizhi.yun.base.BaseHandler;
import com.lizhi.yun.base.PagerView;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.*;


@Service
public class UppRoleMenuHandle extends BaseHandler {

    @Resource
    private UppRoleMenuDao uppRoleMenuDao;

    @Resource
    private UppMenuDao uppMenuDao;


    @SuppressWarnings({ "rawtypes", "unchecked" })
    public ListResponseResult doMain(Pager pager , Map map) {
        PageBounds pageBounds = getPageBounds(pager);
        List<UppRoleMenuPOJO> listUppRoleMenuPOJO = uppRoleMenuDao.selectByMap(map, pageBounds);
        return getListResult(pageBounds.getCountRows(), listUppRoleMenuPOJO, map);

    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List<UppRoleMenuPOJO> doTree(Pager pager , Map map) {
        pager.setPageSize(500);
        PageBounds pageBounds = getPageBounds(pager);
        List<UppRoleMenuPOJO> listUppRoleMenuDO = uppRoleMenuDao.selectByMap(map, pageBounds);
        PagerView<UppRoleMenuPOJO> pagerView = getPagerView(pageBounds.getCountRows(), listUppRoleMenuDO, UppRoleMenuPOJO.class);
        return pagerView.getRows();

    }

    public UppRoleMenuPOJO findById(String roleId, String menuId) {

        UppRoleMenuPOJO UppRoleMenuPOJO = uppRoleMenuDao.selectById(roleId, menuId);
        if (UppRoleMenuPOJO == null) {
            return null;
        }
        return UppRoleMenuPOJO;
    }

    public ListResponseResult insert(String roleId, String menuId) {
        // 根据传入的menuId以逗号进行分隔(新菜单Id)
        Map<String, UppRoleMenuPOJO> newMapRoleMenuDO = new HashMap<>();
        String[] menuIds = StringUtils.isEmpty(menuId) ? new String[] {} : menuId.split(",");
        for (int i = 0; i < menuIds.length; i++) {
            newMapRoleMenuDO = format(roleId, menuIds[i], newMapRoleMenuDO, ButtonIdsEnum.BUTTON_IDS_00.getEnValue());
        }
        // 过滤需要新增和删除的角色菜单
        List<String> roleIds = new ArrayList<String>();
        roleIds.add(roleId);
        System.out.println();
        List<UppRoleMenuPOJO> listOldRoleMenuDO = uppRoleMenuDao.selectByRoleIds(roleIds);
        for (Iterator<UppRoleMenuPOJO> iterator = listOldRoleMenuDO.iterator(); ((Iterator) iterator).hasNext();) {
            UppRoleMenuPOJO uppRoleMenuDO2 = iterator.next();
            if (newMapRoleMenuDO.containsKey(uppRoleMenuDO2.getMenuId())) {
                newMapRoleMenuDO.remove(uppRoleMenuDO2.getMenuId());
                iterator.remove();
            }
        }
        // 需新增的角色菜单
        int insertCount = 0;
        for (UppRoleMenuPOJO uppRoleMenuDO : newMapRoleMenuDO.values()) {
            insertCount += uppRoleMenuDao.insertRecord(uppRoleMenuDO);
        }

        // 需删除的角色菜单
        int deleteCount = 0;
        if (listOldRoleMenuDO.size() != 0) {
            deleteCount = uppRoleMenuDao.deleteRecordList(listOldRoleMenuDO);
        }
        return getListResult(insertCount + deleteCount);
    }

    private Map<String, UppRoleMenuPOJO> format(String roleId, String menuId, Map<String, UppRoleMenuPOJO> newMapRoleMenuDO, String buttonIds){
        UppRoleMenuPOJO uppRoleMenuDOTmp = new UppRoleMenuPOJO();
        uppRoleMenuDOTmp.setRoleId(roleId);
        uppRoleMenuDOTmp.setMenuId(menuId);
        uppRoleMenuDOTmp.setButtonIds(buttonIds);
        uppRoleMenuDOTmp.setIstTm(DateUtils.getNowDate());
        newMapRoleMenuDO.put(uppRoleMenuDOTmp.getMenuId(), uppRoleMenuDOTmp);
        /*先判断是否含有父菜单*/
        UppMenuPOJO uppMenuPOJO = uppMenuDao.selectById(menuId);
        if (!StringUtils.isEmpty(uppMenuPOJO.getParentMenuId())){
            /*含有子目录*/
            format(roleId, uppMenuPOJO.getParentMenuId(), newMapRoleMenuDO, ButtonIdsEnum.BUTTON_IDS_01.getEnValue());
        }
        return newMapRoleMenuDO;
    }

    public boolean isNotexists(String roleId , String menuId) {
        UppRoleMenuPOJO uppRoleMenuPOJO = uppRoleMenuDao.selectById(roleId, menuId);
        if (null == uppRoleMenuPOJO) {
            return true;
        }
        return false;
    }

    public ListResponseResult selectByRoleId(String roleId) {
        if (StringUtils.isEmpty(roleId)) {
            return getListResult(null);
        }
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("buttonIds", ButtonIdsEnum.BUTTON_IDS_00.getEnValue());
        paramMap.put("roleId", roleId);
        List<UppRoleMenuPOJO> selectByRoleIds = uppRoleMenuDao.selectByMap(paramMap, null);
        return getListResult(selectByRoleIds);
        
    }
}